<html>
  <head>
    <title>Ajax</title>
  </head>
  <body>
    <script>
      // Ajax  

              /*
                  abp.ajax api 提供了一种对服务器执行AJAX调用的便捷方式。

                  它在内部使用JQuery的$.ajax,但会为你自动执行一些常见任务：

                        ①、自动处理和本地化错误并通知用户（使用abp. message）。所以你通常不关心错误。

                        ②、自动将防伪造令牌添加到HTTP标头以满足服务器端的CSRF保护验证。

                        ③、自动设置默认选项并允许在单个位置配置默认值。

                        ④、可以在AJAX操作期间阻止UI部分（或整页）。

                        ⑤、允许使用标准$.ajax选项完全自定义任何AJAX调用。


                        虽然abp.ajax使AJAX调用变得非常容易，但您通常会使用动态JavaScript客户端代理系统来执行对服务器端HTTP API的调用。
                        
                        abp.ajax可在您需要执行低级AJAX操作时使用。
              */

              /*
                  一、基本用法   basic Usage

                          abp.ajax接收标准 $.ajax 接收的选项对象。

                          所有标准选项都有效。  

                          它返回一个Promise。

                          eg: 获取用户列表

                                      abp.ajax({
                                        type: 'GET',
                                        url: '/api/identity/users'
                                      }).then(function(result){
                                        console.log(result);
                                      });

                                      如果您已登录到应用程序并且对身份模块的用户管理页面具有权限，则此命令将用户列表记录到控制台。
              */

              /*
                  二、错误处理

                          如果你尚未登录应用程序或者没有执行此请求的权限，上面的示例AJAX会显示错误消息：

                          abp.ajax 会自动处理各种错误，除非你想禁用它。


                          1、标准错误响应    Standard Error Response 

                                    abp.ajax 与ABP的异常处理系统兼容，它正确处理从服务器返回的标准错误格式。 

                                    典型的错误消息是JSON，如下所示：

                                            {
                                              "error": {
                                                "code": "App:010042",
                                                "message": "This topic is locked and can not add a new message",
                                                "details": "A more detailed info about the error..."
                                              }
                                            }

                                    错误小时使用 message 和 details 属性直接显示给用户。

                            
                          2、非标准错误响应码  和  Http状态码

                                    即使服务器没有发送标准错误格式，它也会处理错误。

                                    如果您绕过ABP异常处理系统并在服务器上手动构建HTTP响应，就会出现这种情况。

                                    在这种情况下，会考虑HTTP状态代码。

                                    以下HTTP状态码是预定义的：

                                          ①、401：显示一条错误消息，如“您应该经过身份验证（登录）才能执行此操作”。
                                                
                                                  当用户单击确定按钮时，他们会被重定向到应用程序的主页以使他们再次登录。

                                          ②、403：显示错误消息，如“您不允许执行此操作”。

                                          ③、404：显示类似“在服务器上找不到请求的资源”的错误消息。

                                          ④、其他：显示通用错误消息，如“发生错误。服务器未发送错误详细信息”。

                                    所有这些消息都根据当前用户的语言进行本地化。


                          3、手动处理错误   Manually Handling the Errors 

                                    由于 abp.ajax 返回一个Promise，因此你使用可以链接一个.catch()  调用来注册一个在AJAX请求失败是执行的回调。

                                    eg:  如果AJAX请求失败，则显示警报

                                          abp.ajax({
                                              type: 'GET',
                                              url: '/api/identity/users'
                                          }).then(function(result){
                                              console.log(result);
                                          }).catch(function(){
                                              alert("request failed :(");
                                          });


                                    当你的回调被触发时，ABP仍然会自己处理错误。如果要禁用自动错误处理，请将 abpHandleError:false 传递给 abp.ajax选项。


                                    eg：  禁用自动错误处理

                                          abp.ajax({
                                                  type: 'GET',
                                                  url: '/api/identity/users',
                                                  abpHandleError: false //  禁用abp的自动错误处理
                                          }).then(function(result){
                                                  console.log(result);
                                          }).catch(function(){
                                                  alert("request failed :(");
                                          });


                                    如果您设置了abpHandleError: false并且自己没有捕获错误，那么错误将被隐藏并且请求静默失败。

                                    abp.ajax仍然将错误记录到浏览器控制台（请参阅配置部分以覆盖它）。
                              
              */

              /*
                  三、配置  Configuration

                                abp.ajax有一个全局配置，您可以根据您的要求进行自定义。

                                1、默认AJAX选项

                                        abp.ajax.defaultOpts对象用于配置执行AJAX调用时使用的默认选项，除非您覆盖它们。

                                        此对象的默认值如下所示：

                                                  {
                                                      dataType: 'json',
                                                      type: 'POST',
                                                      contentType: 'application/json',
                                                      headers: {
                                                          'X-Requested-With': 'XMLHttpRequest'
                                                      }
                                                  }

                                        所以，如果要更改默认请求类型，可以如下所示：

                                                  abp.ajax.defaultOpts.type = 'GET';

                                        在所有JavaScript代码之前编写此代码。

                                        你通常希望将此类配置放入单独的JavaScript文件中，并使用全局bundle将其添加到布局中。



                                2、记录&显示错误

                                        可以覆盖以下函数来自定义日志记录并显示错误消息：

                                        ①、abp.ajax.logError函数默认使用abp.log.error（…）记录错误。

                                        ②、abp.ajax.showError函数默认使用abp.message.error（…）显示错误消息。

                                        ③、abp.ajax.handleErrorStatusCode处理不同的HTTP状态代码，并根据代码显示不同的消息。

                                        ③、abp.ajax.handleAbpErrorResponse处理使用标准ABP错误格式发送的错误。

                                        ⑤、abp.ajax.handleNonAbpErrorResponse处理非标准错误响应。

                                        ⑥、abp.ajax.handleUnAuthorizedRequest处理带有401状态代码的响应，并将用户重定向到应用程序的主页。

                                        eg:  覆盖 logError

                                                  abp.ajax.logError = function(error) {
                                                      //...
                                                  }




                                3、其他选项

                                        abp.ajax.ajaxSendHandler函数用于拦截AJAX请求并将防伪令牌添加到HTTP标头。
                                        
                                        请注意，这适用于所有AJAX请求，即使您不使用abp.ajax。
              */
    </script>
  </body>
</html>